package sy4_Creational_Pattern.factory.simple;
/*
 * 简单工厂模式引例：
 * 存在的问题：产品的创建（使用了关键字new）包含在测试类（客户端）里，导致产品创建代码不能复用。
 * 解决方案：使用简单工厂模式。
 */

/*import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

interface TV {
    public void play();
}
class HaierTV implements TV {
    public void play() {
        System.out.println("海尔电视机播放中......");
    }
}
class HisenseTV implements TV {
    public void play() {
        System.out.println("海信电视机播放中......");
    }
}
public class SimpleFactory {  //测试类
    static TV tv = null;
    static String brand;  //品牌
    public static void main(String[] args) {
        do {
            brand = getBrand();  //获取电视机品牌
            if (brand.equalsIgnoreCase("Haier")) {
                System.out.println("电视机工厂生产海尔电视机！");
                tv = new HaierTV();  //接口实现类对象的创建
            } else if (brand.equalsIgnoreCase("Hisense")) {
                System.out.println("电视机工厂生产海信电视机！");
                tv = new HisenseTV();  //接口实现类对象的创建
            } else {
                System.out.println("暂不能生产该品牌的电视机！");
                System.out.println("------------------------");
                break;
            }
            tv.play();  //对象的使用，调用接口方法
            System.out.println("------------------------");
        } while (true);
    }
    static String getBrand() {  
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("请输入电视机的品牌:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}*/

/*
 * 简单工厂模式包含只负责产品创建（提供静态方法）核心类Factory，封装了产品的创建细节，符合单一职责原则。
 * 存在的问题：新增产品品牌，还需要修改已有的工厂类（if嵌套）。
 * 改进方案：使用工厂方法模式。
 */
interface Product {  //角色1：抽象产品
	public void play();  //电视机应该能播放
}

class ConcreteProductA implements Product { //角色2：具体产品ConcreteProductA
	@Override
	public void play() {
		System.out.println("海尔电视机播放中......");
	}

}

class ConcreteProductB implements Product {  //角色2：具体产品ConcreteProductB
	@Override
	public void play() {
		System.out.println("海信电视机播放中......");
	}
}

class Factory {  //角色3：工厂类
	//生产所需产品（某种品牌）的静态方法
	public static Product produce(String brand) throws Exception {
		if (brand.equalsIgnoreCase("Haier")) {  //忽略字母大小写
			System.out.println("电视机工厂生产海尔电视机！");
			return new ConcreteProductA();
		} else if (brand.equalsIgnoreCase("Hisense")) {
			System.out.println("电视机工厂生产海信电视机！");
			return new ConcreteProductB();
		} else {
			//抛出错误品牌异常
			throw new Exception("对不起，暂不能生产该品牌电视机！");
		}
	}
}

public class SimpleFactory {  //测试类
	public static void main(String[] args) {
		try {
			//输入不合适的方法参数，可能产生异常
			Product tv = Factory.produce("Haier");  //参数haier也可
			//Product tv = Factory.produce("Hisense");
			tv.play();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}

